﻿#include<stdio.h>
#include<windows.h>

//文本代码->可执行程序(二进制文件) ->双击运行该程序
//生成可执行程序并运行

int main()
{
	printf("hello world\n");
	system("pause");
	return 0;
}

//局部变量：包含在代码块中的变量叫做局部变量。
//          局部变量具有临时性。进入代码块，自动形成局部变量，
//                              退出代码块自动释放。
//全局变量：在所有函数外定义的变量，叫做全局变量。
//          全局变量具有全局性。
//代码块：用{}括起来的区域，就叫做代码块
#include <stdio.h>
#include <windows.h>

int g_x =100;  //全局变量

int main() {
	int x = 10; //局部变量，main函数也是函数，也有代码块{} 
	printf("x:%d\n", x);
	system("pause");
	return 0;
}

//作用域概念：指的是该变量的可以被正常访问的代码区域
#include <stdio.h>
#include <windows.h>
int main(){ 
	int x = 10; 
	if (x == 10)
	{ 
		int y = 20;
		printf("局部: x: %d, y: %d\n", x, y);//y只能在本代码块内有效 
	} 
		//printf("局部: x: %d, y: %d\n", x, y); //报错，y不能被访问 
		system("pause"); 
		return 0;
}

//局部变量：只在本代码块内有效
//全局变量：整个程序运行期间，都有效
#include <stdio.h>
#include <windows.h>

int g_x = 100;//全局变量

void show(){ 
	printf("show: 全局: %d\n", g_x); //在任何代码块中都可以被访问
}
int main(){
	show();
	printf("main: 全局: %d\n", g_x); //在任何代码块中都可以被访问，甚至被修改 
	system("pause"); 
	return 0;
}

#include <stdio.h>
#include <windows.h>
int g_x = 100;//全局变量
int main() {
	int g_x = 10; //局部变量，与全局同名
	printf("g_x:%d\n", g_x); //输出的是局部，也就是局部和全部同名的时候，优先局部。所以，强烈不建议这样干。
	system("pause"); 
	return 0;
}

//生命周期概念：指的是该变量从定义到被释放的时间范围，所谓的释放，指的是曾经开辟的空间”被释放“
//局部变量： 进入代码块，形成局部变量[开辟空间]，退出代码块，"释放"局部变量
//全局变量: 定义完成之后，程序运行的整个生命周期内，该变量一直都有效

//如何使用：一般在代码块中定义的变量，即局部变量，默认都是auto修饰的，不过一般省略
//默认的所有变量都是auto吗？不是，一般用来修饰局部变量
//中断一下：后面我们所到的，局部变量，自动变量，临时变量，都是一回事。我们统称局部变量
#include <stdio.h>
#include <windows.h>
int main() {
	for (int i = 0; i < 10; i++)
	{
		printf("i=%d\n", i);
		if (1)
		{
			auto int j = 0;//自动变量 
			printf("before: j=%d\n", j);
			j += 1;
			printf("after : j=%d\n", j);
		}
	}
	system("pause");
	return 0;
}
	
//register 
//其实，CPU主要是负责进行计算的硬件单元，但是为了方便运算，一般第一步需要先把数据从内存读取到CPU内，那么
//也就需要CPU具有一定的数据临时存储能力。注意：CPU并不是当前要计算了，才把特定数据读到CPU里面，那样太慢了。
//所以现代CPU内，都集成了一组叫做寄存器的硬件，用来做临时数据的保存。

//存储金字塔  距离CPU越近的存储硬件，速度越快。

//寄存器存在的本质
// 在硬件层面上，提高计算机的运算效率。因为不需要从内存里读取数据啦。
 
//register修饰变量 尽量将所修饰变量，放入CPU寄存区中，从而达到提高效率的目的

//那么什么样的变量，可以采用register呢？
//1. 局部的(全局会导致CPU寄存器被长时间占用)
//2. 不会被写入的(写入就需要写回内存，后续还要读取检测的话，register的意义在哪呢？)
//3. 高频被读取的(提高效率所在)
//4. 如果要使用，请不要大量使用，因为寄存器数量有限
//这里除了上面的, 再有一点，就是register修饰的变量，不能取地址(因为已经放在寄存区中了)
#include <stdio.h>
#include <windows.h>
int main(){ 
	register int a = 0; 

	printf("&a = %p\n", &a);
	//编译器报错：错误 1 error C2103: 寄存器变量上的“&”

    system("pause");
	return 0;
}

